using System.Threading.Tasks;
using DailyPoetryX.AzureStorage.Models;
using Microsoft.WindowsAzure.Storage.Table;

namespace DailyPoetryX.AzureStorage.Services.Implementations {
    /// <summary>
    /// 表授权服务。
    /// </summary>
    public class TableAuthorizationService : IAuthorizationService {
        /******** 公开变量 ********/

        /******** 私有变量 ********/

        /// <summary>
        /// 表名。
        /// </summary>
        private const string TableName = "Authorization";

        /// <summary>
        /// 分区键。
        /// </summary>
        private const string PartitionKey = TableName;

        /// <summary>
        /// 表存储。
        /// </summary>
        private CloudTable _table;

        /******** 继承方法 ********/

        /// <summary>
        /// 检查用户是否具有访问服务的授权。
        /// </summary>
        /// <param name="name">用户名。</param>
        public async Task<bool> AuthorizeAsync(string name) {
            var tableOperation =
                TableOperation.Retrieve<AuthorizationEntity>(PartitionKey,
                    name);
            return ((await _table.ExecuteAsync(tableOperation)).Result as
                AuthorizationEntity) != null;
        }

        /******** 公开方法 ********/

        /// <summary>
        /// 表授权服务。
        /// </summary>
        /// <param name="accountProvider">Azure存储账户提供者。</param>
        public TableAuthorizationService(
            IAzureStorageAccountProvider accountProvider) {
            var tableClient = accountProvider.GetAccount()
                .CreateCloudTableClient();
            _table = tableClient.GetTableReference(TableName);
        }

        /******** 私有方法 ********/
    }
}